package com.smart.translator.utils;

import android.content.Context;
import android.content.SharedPreferences;
import org.json.JSONArray;
import org.json.JSONObject;

/**
 * 键位位置工具类
 * 提供根据分组和ID获取按钮位置的外部接口
 */
public class KeyPositionUtils {
    private static final String PREFS_NAME = "key_settings";
    private static final String KEY_POSITIONS = "key_positions";
    
    // 分组定义
    public static final String[] GROUP_NAMES = {"微信", "QQ", "Facebook", "WhatsApp", "其他"};
    
    // 包名映射
    public static final String[] PACKAGE_NAMES = {
        "com.tencent.mm",      // 微信
        "com.tencent.mobileqq", // QQ
        "com.facebook.katana",  // Facebook
        "com.whatsapp",         // WhatsApp
        ""                      // 其他（用户自定义）
    };
    
    // ID定义
    public static final int ID_INPUT_NO_IME = 0;        // 未调起输入法点击输入框
    public static final int ID_SEND_NO_IME = 1;         // 未调起输入法点击发送按钮
    public static final int ID_INPUT_WITH_IME = 2;      // 调起输入法点击输入框
    public static final int ID_SEND_WITH_IME = 3;       // 调起输入法点击发送按钮
    
    /**
     * 根据分组索引和ID获取按钮的中心位置坐标
     * @param context 上下文
     * @param groupIndex 分组索引 (0:微信, 1:QQ, 2:Facebook, 3:WhatsApp, 4:其他)
     * @param groupId 功能ID (0-3)
     * @return 按钮中心位置坐标，如果未找到返回null
     */
    public static Point getButtonPosition(Context context, int groupIndex, int groupId) {
        try {
            SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
            String json = prefs.getString(KEY_POSITIONS, "[]");
            JSONArray array = new JSONArray(json);
            
            for (int i = 0; i < array.length(); i++) {
                JSONObject obj = array.getJSONObject(i);
                int savedGroupIndex = obj.optInt("groupIndex", 0);
                int savedGroupId = obj.optInt("groupId", -1);
                
                if (savedGroupIndex == groupIndex && savedGroupId == groupId) {
                    int x = (int) obj.getDouble("x");
                    int y = (int) obj.getDouble("y");
                    return new Point(x, y);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 根据分组名称和ID获取按钮的中心位置坐标
     * @param context 上下文
     * @param groupName 分组名称
     * @param groupId 功能ID (0-3)
     * @return 按钮中心位置坐标，如果未找到返回null
     */
    public static Point getButtonPosition(Context context, String groupName, int groupId) {
        for (int i = 0; i < GROUP_NAMES.length; i++) {
            if (GROUP_NAMES[i].equals(groupName)) {
                return getButtonPosition(context, i, groupId);
            }
        }
        return null;
    }
    
    /**
     * 根据包名和ID获取按钮的中心位置坐标
     * @param context 上下文
     * @param packageName 应用包名
     * @param groupId 功能ID (0-3)
     * @return 按钮中心位置坐标，如果未找到返回null
     */
    public static Point getButtonPositionByPackage(Context context, String packageName, int groupId) {
        for (int i = 0; i < PACKAGE_NAMES.length; i++) {
            if (PACKAGE_NAMES[i].equals(packageName)) {
                return getButtonPosition(context, i, groupId);
            }
        }
        return null;
    }
    
    /**
     * 根据包名获取分组索引
     * @param packageName 应用包名
     * @return 分组索引，如果未找到返回-1
     */
    public static int getGroupIndexByPackage(String packageName) {
        for (int i = 0; i < PACKAGE_NAMES.length; i++) {
            if (PACKAGE_NAMES[i].equals(packageName)) {
                return i;
            }
        }
        return -1;
    }
    
    /**
     * 根据分组索引获取包名
     * @param groupIndex 分组索引
     * @return 包名，如果索引无效返回null
     */
    public static String getPackageByGroupIndex(int groupIndex) {
        if (groupIndex >= 0 && groupIndex < PACKAGE_NAMES.length) {
            return PACKAGE_NAMES[groupIndex];
        }
        return null;
    }
    
    /**
     * 根据分组名称获取包名
     * @param groupName 分组名称
     * @return 包名，如果未找到返回null
     */
    public static String getPackageByGroupName(String groupName) {
        for (int i = 0; i < GROUP_NAMES.length; i++) {
            if (GROUP_NAMES[i].equals(groupName)) {
                return PACKAGE_NAMES[i];
            }
        }
        return null;
    }
    
    /**
     * 获取所有支持的包名列表
     * @return 包名数组
     */
    public static String[] getSupportedPackages() {
        return PACKAGE_NAMES.clone();
    }
    
    /**
     * 检查指定分组和ID的按钮是否存在
     * @param context 上下文
     * @param groupIndex 分组索引
     * @param groupId 功能ID
     * @return 是否存在
     */
    public static boolean isButtonExists(Context context, int groupIndex, int groupId) {
        return getButtonPosition(context, groupIndex, groupId) != null;
    }
    
    /**
     * 检查指定包名和ID的按钮是否存在
     * @param context 上下文
     * @param packageName 应用包名
     * @param groupId 功能ID
     * @return 是否存在
     */
    public static boolean isButtonExistsByPackage(Context context, String packageName, int groupId) {
        return getButtonPositionByPackage(context, packageName, groupId) != null;
    }
    
    /**
     * 获取指定分组下已配置的按钮数量
     * @param context 上下文
     * @param groupIndex 分组索引
     * @return 已配置的按钮数量
     */
    public static int getConfiguredButtonCount(Context context, int groupIndex) {
        try {
            SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
            String json = prefs.getString(KEY_POSITIONS, "[]");
            JSONArray array = new JSONArray(json);
            
            int count = 0;
            for (int i = 0; i < array.length(); i++) {
                JSONObject obj = array.getJSONObject(i);
                int savedGroupIndex = obj.optInt("groupIndex", 0);
                int savedGroupId = obj.optInt("groupId", -1);
                
                if (savedGroupIndex == groupIndex && savedGroupId >= 0) {
                    count++;
                }
            }
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    
    /**
     * 获取指定包名下已配置的按钮数量
     * @param context 上下文
     * @param packageName 应用包名
     * @return 已配置的按钮数量
     */
    public static int getConfiguredButtonCountByPackage(Context context, String packageName) {
        int groupIndex = getGroupIndexByPackage(packageName);
        if (groupIndex >= 0) {
            return getConfiguredButtonCount(context, groupIndex);
        }
        return 0;
    }
    
    /**
     * 获取指定包名的所有按钮位置信息
     * @param context 上下文
     * @param packageName 应用包名
     * @return 按钮位置信息数组，如果未找到返回空数组
     */
    public static ButtonInfo[] getAllButtonPositionsByPackage(Context context, String packageName) {
        try {
            SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
            String json = prefs.getString(KEY_POSITIONS, "[]");
            JSONArray array = new JSONArray(json);
            
            java.util.List<ButtonInfo> buttonInfos = new java.util.ArrayList<>();
            int groupIndex = getGroupIndexByPackage(packageName);
            
            if (groupIndex >= 0) {
                for (int i = 0; i < array.length(); i++) {
                    JSONObject obj = array.getJSONObject(i);
                    int savedGroupIndex = obj.optInt("groupIndex", 0);
                    int savedGroupId = obj.optInt("groupId", -1);
                    
                    if (savedGroupIndex == groupIndex && savedGroupId >= 0) {
                        int x = (int) obj.getDouble("x");
                        int y = (int) obj.getDouble("y");
                        String description = obj.optString("description", "");
                        buttonInfos.add(new ButtonInfo(savedGroupId, x, y, description));
                    }
                }
            }
            
            return buttonInfos.toArray(new ButtonInfo[0]);
        } catch (Exception e) {
            e.printStackTrace();
            return new ButtonInfo[0];
        }
    }
    
    /**
     * 位置坐标类
     */
    public static class Point {
        public int x, y;
        
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
        
        @Override
        public String toString() {
            return "Point{x=" + x + ", y=" + y + "}";
        }
    }
    
    /**
     * 按钮信息类
     */
    public static class ButtonInfo {
        public int groupId;
        public int x, y;
        public String description;
        
        public ButtonInfo(int groupId, int x, int y, String description) {
            this.groupId = groupId;
            this.x = x;
            this.y = y;
            this.description = description;
        }
        
        @Override
        public String toString() {
            return "ButtonInfo{groupId=" + groupId + ", x=" + x + ", y=" + y + ", description='" + description + "'}";
        }
    }
} 